#include "HttpServer.hpp"
#include <memory>
#include <iostream>
#include <string>
#include "UserManual.hpp"
#include "util.hpp"
#include <fstream>  // C++中的文件流

static const char* ROOTPATH = "wwwroot";

void httpFunc(int socket)
{
    char buffer[10240];
    ssize_t n = recv(socket, buffer, sizeof(buffer) - 1, 0);
    if (n > 0)
    {
        buffer[n] = '\0';
        std::cout << buffer << "\n---------------------------------" << std::endl;
        // web服务器收到的是一个http的请求
        // 方法 路径(没有默认\) 协议版本\r\n
        // key-value....
        // \r\n
        // 请求正文(可以没有)

        // 1试着自己手动构建一个http响应
        // std::string httpresponse = "HTTP/1.1 200 ok\r\n";  // 协议版本 状态码(比如404) 状态码描述\r\n
        // httpresponse += "\r\n";  // 空行
        // // 正文
        // httpresponse += "<html><h3>hello!</h3></html>";  // 一般不这么写，一般卸载html文件内，这里只是作为测试
        // send(socket, httpresponse.c_str(), httpresponse.size(), 0);  // 向客户端(比如浏览器访问此web服务器)

        std::vector<std::string> v;  // 整体数据
        cutString(v, "\r\n", buffer);  // 对传回来的请求做解析，提取每一行数据
        std::vector<std::string> requestline;  // 针对于请求行
        cutString(requestline, " ", v[0]);

        std::string httpresponse;  // 要发送的响应
        std::string path;  // 打开资源的路径
        if (requestline[1] == "/")
        {
            // 默认不添加任何资源位置，就是/-默认的
            path = "wwwroot/index.html";
        }
        else path = ROOTPATH + requestline[1];

        std::string text;
        std::ifstream in(path);  // 默认in 读的方式打开本地文件
        httpresponse += "HTTP/1.1 200 ok\r\n";  // 2xx 为正确响应
        if (in.is_open())
        {
            // httpresponse += "HTTP/1.1 200 ok\r\n";  // 2xx 为正确响应
            // 成功打开
            std::string line;
            while (std::getline(in, line))
            {
                text += line;
            }
            in.close();
        }
        else
        {
            // httpresponse += "HTTP/1.1 404 NotFound\r\n";  // 4xx 为服务器无法处理请求
            // 打开文件失败，返回错误界面
            std::ifstream err("wwwroot/error/error.html");
            std::string line;
            while (std::getline(err, line))
            {
                text += line;
            }
            err.close();
        }

        httpresponse += "\r\n";  // 空行，属性没有带
        httpresponse += text;  // 响应正文

        send(socket, httpresponse.c_str(), httpresponse.size(), 0);
    }
}

int main(int argc, char* argv[])
{
    if (argc != 2)
    {
        User(argv[0]);
        exit(-1);
    }

    std::unique_ptr<HttpServer> server(new HttpServer(atoi(argv[1]), httpFunc));
    server->init();
    server->start();

    // std::vector<std::string> v;
    // cutString(v, ".", "https://www.bilibili.com/?spm_id_from=444.41.b_696e7465726e6174696f6e616c486561646572.1");
    // for (auto& s : v)
    // {
    //     std::cout << s << std::endl;
    // }
    return 0;
}